﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using condortravel.operaciones.core.DataModel;
using System.Data.Linq;
using condortravel.operaciones.entities.Entities;


namespace condortravel.operaciones.persistence.operacionesImpl
{
    public class ItinerarioDAOImpl : condortravel.operaciones.persistence.Impl.GenericDAO<Tb_ItinerarioViajero,int>
    {

        #region Customer Methods


        public void updateEstadoItinerario(Tb_ItinerarioViajero entity)
        {
            Tb_ItinerarioViajero itinerario;
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }

                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {
                    itinerario = dataContext.GetTable<Tb_ItinerarioViajero>().Where(p => p.itinerarioViajero_ID == entity.itinerarioViajero_ID).Single();
                    itinerario.estadoItinerario_ID = entity.estadoItinerario_ID;
                    dataContext.SubmitChanges();
                }
            }
            
        }


        /// <summary>
        /// Obtiene una lista de itinerarios segun criterio de busqueda
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public List<Tb_ItinerarioViajero> getListItinerarioByCriteria(FilterItinerarioCriteria filter)
        {
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }
                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {
                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_Cliente);
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_Agente);
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_PaqueteTuristico);
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_Estado_Itinerario);
                    dataContext.LoadOptions = options;

                    return (from p in dataContext.GetTable<Tb_ItinerarioViajero>()
                            where
                            ((p.itinerarioViajero_ID == filter.Itinerario && filter.Itinerario != 0) || (filter.Itinerario == 0)) &&
                            ((p.agente_ID == filter.Agente && filter.Agente != 0) || (filter.Agente == 0)) &&
                            ((p.fechaInicio >= filter.FecInicio && filter.FecInicio != DateTime.MinValue) || (filter.FecInicio == DateTime.MinValue)) &&
                            ((p.fechaTermino >= filter.FecFin && filter.FecFin != DateTime.MinValue) || (filter.FecFin == DateTime.MinValue)) &&
                            ((p.paqueteTuristico_ID==filter.Paquete && filter.Paquete != 0) || (filter.Paquete == 0)) &&
                            ((p.estadoItinerario_ID == filter.Estado && filter.Estado != 0) || (filter.Estado == 0)) &&
                            ((p.Tb_Cliente.nombre.Contains(filter.Nombre) && !filter.Nombre.Equals(String.Empty)) || (filter.Nombre.Equals(String.Empty))) &&
                            ((p.Tb_Cliente.apellido.Contains(filter.Apellidos) && !filter.Apellidos.Equals(String.Empty)) || (filter.Apellidos.Equals(String.Empty))) && 
                            ((p.Tb_Cliente.dni.Contains(filter.Dni) && !filter.Dni.Equals(String.Empty)) || (filter.Dni.Equals(String.Empty)))                            
                            select p).ToList<Tb_ItinerarioViajero>();
                }

            }
        }

        public List<Tb_ItinerarioViajero> getListItinerarioByCliente(int cliente)
        {
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }
                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {
                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_Cliente);
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_Agente);
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_PaqueteTuristico);
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_Estado_Itinerario);
                    dataContext.LoadOptions = options;

                    return (from p in dataContext.GetTable<Tb_ItinerarioViajero>()
                            where
                            (p.cliente_ID ==cliente)
                            select p).ToList<Tb_ItinerarioViajero>();
                }

            }
        }


        
        /// <summary>
        /// 
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public List<Tb_ItinerarioViajero> getListItinerarioByAgent(FilterItinerarioCriteria filter)
        {
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }
                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {
                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_Cliente);
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_Agente);
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_PaqueteTuristico);
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_Estado_Itinerario);
                    dataContext.LoadOptions = options;

                    return (from p in dataContext.GetTable<Tb_ItinerarioViajero>()
                            where
                            ((p.agente_ID == filter.Agente)) &&
                            ((p.estadoItinerario_ID == filter.Estado))
                            orderby p.fechaTermino descending
                            select p).ToList<Tb_ItinerarioViajero>();
                }

            }
        }


        #endregion

        #region CRUD Methods

        public override Tb_ItinerarioViajero update(Tb_ItinerarioViajero entity)
        {
            Tb_ItinerarioViajero itinerario;
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }

                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {
                    itinerario = dataContext.GetTable<Tb_ItinerarioViajero>().Where(p => p.itinerarioViajero_ID == entity.itinerarioViajero_ID).Single();
                    itinerario.agencia_ID = entity.agencia_ID;
                    itinerario.agente_ID = entity.agente_ID;
                    itinerario.estadoItinerario_ID = entity.estadoItinerario_ID;
                    dataContext.SubmitChanges();
                }
            }
            return itinerario;
        }

        public override Tb_ItinerarioViajero getByID(int id)
        {
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }
                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {
                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_Cliente);
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_Agente);
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_PaqueteTuristico);
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_Estado_Itinerario);
                    dataContext.LoadOptions = options;
                    return (from p in dataContext.GetTable<Tb_ItinerarioViajero>()
                            where p.itinerarioViajero_ID == id
                            select p).SingleOrDefault<Tb_ItinerarioViajero>();

                }
            }
        }

        public override void delete(int pk)
        {
            throw new NotImplementedException();
        }
        #endregion
    }
}
